﻿//DuongNA optimized 26/11/2007
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Web;
using System.Web.SessionState;
using Portal.API;
using System.Web.UI;
using Cache = Portal.SiteSystem.Cache;
namespace Portal.Ultility
{
	/// <summary>
	/// Lớp thực hiện nhận các yêu cầu đến các tệp có đuôi được quy định trong CustomExtension
	/// và chuyển hướng các yêu cầu đến trang chứa Tab tương ứng.
	/// </summary>
	public class TabHttpHandler : IHttpHandler, IRequiresSessionState
	{
		/// <summary>
		/// Hàm xử lý Request đến các trang có đuôi quy định trong CustomExtension
		/// </summary>
		/// <param name="context">Biến Context chứa Request</param>
		public void ProcessRequest(HttpContext context) 
		{
            context.Items["originalQuerystring"] = context.Request.QueryString.ToString();
            context.Items["originalPathInfo"] = context.Request.PathInfo;


			//string strFolderName =HttpContext.Current.Server.MapPath("Cache");
			string url="";

            //string a = context.Request.HttpMethod;
            //int i = context.Request.Form.Count;
            HandlerServerRequest(context, ref url);
            string [] strQueries=url.Split("?".ToCharArray());
            string page = strQueries[0];
            string strQuery = "";
            if (strQueries.Length > 1)
                strQuery = strQueries[1];
            context.RewritePath(context.Request.Path, string.Empty, strQuery);
            Page hand = (Page)PageParser.GetCompiledPageInstance(page, context.Server.MapPath(page), context);
            hand.PreRenderComplete += new EventHandler(hand_PreRenderComplete);
            //try
            //{
               hand.ProcessRequest(context);
           //}
           //catch
           //{
           //    //HttpContext.Current.Response.Redirect("/portal/login.chn");
               
           //}		
		}
        protected void hand_PreRenderComplete(object sender, EventArgs e)
        {

               HttpContext.Current.RewritePath(HttpContext.Current.Request.Path,
               HttpContext.Current.Items["originalPathInfo"].ToString(),
               HttpContext.Current.Items["originalQuerystring"].ToString());

        }
		private void HandlerServerRequest(HttpContext context,ref string url)
		{
            Cache cache = new Cache(HttpContext.Current.Application);
			string strRq=context.Request.Url.AbsolutePath;
            string currentUser = context.User.Identity.Name;
		    //DuongNA tạm thời bỏ check Rss
            //if (strRq.IndexOf(".rss")>0 )
            //{
            //    DataSet _objDataset= new DataSet();
            //    context.Response.ContentType="text/Xml";
            //    string[] urls=context.Request.Url.AbsolutePath.Split("/".ToCharArray());
            //    string _file=urls[urls.Length-1];
            //    _objDataset.ReadXml(context.Request.PhysicalApplicationPath + @"RSS/" +_file);
            //    _objDataset.WriteXml(context.Response.OutputStream);	
            //}
            //else//sử dlý với tab
			{
			    //lấy path từ root VD : home/b_cine.chn
				string path = context.Request.Url.AbsolutePath.ToLower();
                string strRoot = "";

				// Kiểm tra Cache xem đường dẫn này đã xử lý lần nào chưa - so voi ca duong dan that
                string _strCacheKey = Config.GetPortalUniqueCacheKey() + path + "_" + currentUser;
                string _strCacheRawKey = Config.GetPortalUniqueCacheKey() + "_Raw" + context.Request.RawUrl + "_" + currentUser;
                if (cache[_strCacheKey] != null && cache[_strCacheRawKey] != null && cache[_strCacheRawKey].ToString() == context.Request.RawUrl)
                {
                    string _strCachedURL = (string)cache[_strCacheKey];
                    url = _strCachedURL;
                    return;
                }
                else
                {
					string newsRef = "",templistRef="",newstemp="",multiref="";//dung trong cac truong hop:Co so, lay cpmode, template, bien k so
                    string[] newsParams;
                    //cắt ký tự đầu "/"
                    string tabRef = path.Substring(path.IndexOf("/")+1); //path.Substring(path.LastIndexOf("/") + 1); Replace(strRoot, "");// get "TabRef.ext"
                    //cắt ký tự cuối ".chn"
					tabRef = tabRef.Substring(0, tabRef.LastIndexOf(Config.GetAppConfigValue("CustomExtension"))); // get "TabRef"

					// Kiểm tra để tách lọc phần mã tham chiếu của tin - Them co che do tin newsRef va luu url vao cache de khoi ton tai nguyen.
					if (tabRef != "")
					{
					    //mảng các thành phần url
						string[] _arrReferenceParts = tabRef.Split("/".ToCharArray());
                        
					    //truong hop khi thong so cua tabref nhanh duoc co tu 2 phan tro len thi:
                        //1. xac dinh xem thanh phan cuoi co phai ID cua tin khong? Neu phai thi day la dang tab --> News (Co the dat them dau hieu de nhan dien news
                        //2. Neu khong phai la ID cua tin thi co 2 truong hop say ra 1- la tabref luon , 2- la mot loai query moi
					    
					    //nếu là tin
                        if ((_arrReferenceParts.Length >= 2 && StringProcess.IsNumber(_arrReferenceParts[_arrReferenceParts.Length - 1])) || (_arrReferenceParts.Length >= 2 && _arrReferenceParts[_arrReferenceParts.Length - 1].IndexOf("_tm,")>0))
                        {
                            string[] str = {"_tm,"};
                            //mảng tách bởi chỗi _tm,
                            newsParams = _arrReferenceParts[_arrReferenceParts.Length - 1].Split(str,StringSplitOptions.None);
                            //if(newsParams.Length ==0)
                            //    newsRef = _arrReferenceParts[_arrReferenceParts.Length - 1];
                            //else 
                            newsRef = newsParams[0];
                            if (newsParams.Length > 0)
                            {
                                //chuoi co dang home/parent/child/newsid_tm,3_title.chn
                                if(_arrReferenceParts[_arrReferenceParts.Length - 1].IndexOf("_tm,")>0)
                                {
                                    //newstemp co dang 3_title
                                    newstemp = newsParams[newsParams.Length - 1].Substring(0,1);
                                }
                                    
                                //lay phan con lai lam tabref :home/parent/child
                                tabRef = tabRef.Replace("/"+_arrReferenceParts[_arrReferenceParts.Length - 1], "");
                            }
                            _arrReferenceParts = String.Join("/", _arrReferenceParts, 0, _arrReferenceParts.Length - 1).Split("/".ToCharArray());
                            //xet truong hop xuat hien cpmode
                            //nếu trường hợp user login vào phần quản trị
                            //if (Config.cpmode.IndexOf(_arrReferenceParts[_arrReferenceParts.Length - 1]) >= 0)
                            //{
                                templistRef = _arrReferenceParts[_arrReferenceParts.Length - 1];
                                tabRef = String.Join("/", _arrReferenceParts, 0, _arrReferenceParts.Length - 1);
                            //}
                        }
                        else
                        {
                            //truong hop khong phai newsref
                            if (_arrReferenceParts.Length >= 2)
                            {
                                //nếu trường hợp user login vào phần quản trị
                                //if (Config.cpmode.IndexOf(_arrReferenceParts[_arrReferenceParts.Length - 1]) >= 0)
                                //{
                                if (_arrReferenceParts.Length == 2)
                                {
                                    templistRef = _arrReferenceParts[_arrReferenceParts.Length - 1];
                                    tabRef = String.Join("/", _arrReferenceParts, 0, _arrReferenceParts.Length - 1);
                                }
                                else
                                {
                                    templistRef = _arrReferenceParts[_arrReferenceParts.Length - 2];
                                    newsRef = _arrReferenceParts[_arrReferenceParts.Length - 1];
                                    if (newsRef.IndexOf(",") > -1)
                                    {
                                        multiref = newsRef;
                                        newsRef = "";
                                    }

                                    tabRef = String.Join("/", _arrReferenceParts, 0, _arrReferenceParts.Length - 2);
                                }
                            }
                        }
					}

					// Tập hợp danh sách các biến sẽ có trong URL mới
					//Hashtable r = new Hashtable();                                        
                    //foreach(string key in context.Request.QueryString.Keys)
                    //{
                    //    r[key] = context.Request[key];
                    //}
                    //DuongNA ----
                    //thay dùng hashtable = generic
                    Dictionary<string, string> r = new Dictionary<string, string>();
                    foreach (string key in context.Request.QueryString.Keys)
                    {
                        r[key] = context.Request[key];
                    }
                    //kiem tra xem - neu truong hop tabref co bao nhieu / thi lui ra bay nhieu lan de tro vao dung muc
                    int intSecNum = 0;
                    string[] strSecs = tabRef.Split("/".ToCharArray());
                    intSecNum = strSecs.Length;
                    //cu co them bien query thi phai tang do xau cua duong dan len 1
                    //Check trong truong hop neu co newsref thi chuyen tab ve details
                    // Xây dựng URL mới
                    url = Config.GetMainPage(currentUser);
                    if (newsRef != "" && url.ToLower().IndexOf("displaycontent.aspx") >= 0)
                    {
                        //intSecNum++;
                        switch (newstemp)
                        {
                            case "1":
                                r["TabRef"] = "home.details.life_details";
                                break;
                            case "2":
                                r["TabRef"] = "home.details.music_details";
                                break;
                            case "3":
                                r["TabRef"] = "home.details.star_details";
                                break;
                            case "4":
                                r["TabRef"] = "home.details.cine_details";
                                break;
                            case "5":
                                r["TabRef"] = "home.details.cine_profile_details";
                                break;
                            case "6":
                                r["TabRef"] = "home.details.fashion_xuhuong";
                                break;
                            case "8":
                                r["TabRef"] = "home.details.fashion_tieudiem";
                                break;
                            case "7":
                                r["TabRef"] = "home.details.fashion_styleup";
                                break;
                            default:
                                r["TabRef"] = tabRef.Replace("/", ".");
                                break;
                        }
                        
                        r["RealRef"] = tabRef.Replace("/", ".");
                        
                    }
                    else
                    {
                        //if(newsRef !="")
                        //    intSecNum++;
                        r["TabRef"] = tabRef.Replace("/", ".");
                    }
                    //if (templistRef != "")
                    //    intSecNum++;
                    r["NewsRef"] = newsRef;
                    r["cpmode"] = templistRef;
                    r["multiref"] = multiref;
                    bool firstParam = true;
                    //foreach (DictionaryEntry e in r)
                    //{
                    //    if (firstParam)
                    //    {
                    //        url += "?";
                    //        firstParam = false;
                    //    }
                    //    else
                    //    {
                    //        url += "&";
                    //    }
                    //    url += e.Key+ "=" + e.Value;
                    //}
                    //DuongNA--------------------
                    //thay dùng hashtable = generic
                    foreach (KeyValuePair<string ,string > e in r)
                    {
                        if (firstParam)
                        {
                            url += "?";
                            firstParam = false;
                        }
                        else
                        {
                            url += "&";
                        }
                        
                        url += e.Key + "=" + e.Value;
                    }
                    url = "~/" + url;

                    // Ghi vào Cache
                    //context.Cache.Insert(_strCacheKey, url, new CacheDependency(Portal.API.Config.GetPortalDefinitionPhysicalPath()));
                    cache[_strCacheKey]= url;
                    cache[_strCacheRawKey] = context.Request.RawUrl;
                    
                }
			}
		}
	    public bool IsReusable
	    {
	        get
	        {
	            return true;
	        }
	    }
	}
}
